#include <iostream>
using namespace std;
void show(int* qizi, int size) {
    for (int i = 0; i < size; i++)
    {
        for (size_t j = 0; j < size; j++)
        {
           if (qizi[i] == j)
           {
               cout<<"1"<<endl;;//表示放了棋子 
           }
           else {
              cout<<"0"<<endl;;//表示没有放棋子 
           }
           
        }
       cout<<endl;
    }
  cout<<endl;
    
}
bool judgment(int size, int *qizi, int row, int column) {
    int leftUp = column - 1;//左上角 
    int rightUp = column + 1;//右上角 
    for (int i = row - 1; i >= 0; --i)
    {
        if(qizi[i] == column)//当列已经放有棋子时不可以放 
        {
            return false;
        }

        if (leftUp >= 0 && qizi[i] == leftUp)//当左上角放有棋子时不可以放 
        {
            return false;
        }

        if (rightUp < size && qizi[i] == rightUp )//当右上角放有棋子时不可以放 
        {
            return false;
        }

        //继续查看左上角和右上角的其他位置 
        --leftUp;
        ++rightUp;
    }

    return true;
    
}
void queen(int size, int* qizi, int row, int &count) {//用&实参才会跟着改变 
    if (size == row) {//终止条件 
        ++count;
        show(qizi, size);//给出结果 
        return;
    }
    for (int i = 0; i < size; i++)
    {
        if (judgment(size, qizi, row, i))//判断是否可以放棋子 
        {
            qizi[row] = i;//可以放就记住该棋子所放列 
            queen(size, qizi, row + 1, count);//再进行下一个棋子的放位 
        }
    }

}

int main() {
    int size;
    while (true)
    {
      cout<<"请输入棋盘的规格:";
      cin>>size;
       
        if (size <= 0)
        {
          cout<<"错误！";
            break;
        }

        int *qizi = new int[size]();//记住棋子的列数 
        int count = 0;//记录可以有的方法数 

        queen(size, qizi, 0, count);  

       cout<<"我们有"<<count<<"种方法。";break;
    } 
    return 0; 